package com.regan.erp.controller.base;

import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.crypto.SecureUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.PropertyNamingStrategy;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.jfinal.core.Controller;
import com.jfinal.kit.Kv;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.Model;
import com.regan.erp.model.Menu;
import com.regan.erp.model.User;
import com.regan.erp.util.AuthUtil;
import com.regan.erp.util.UserUtil;

import java.util.List;

/**
 * BaseController 封装controller基础方法
 * @author zhangby
 * @date 2018/9/12 下午12:15
 */
public class BaseController extends Controller {

    /**
     * 获取当前登录用户
     * @return
     */
    public User getLoginUser() {
        return UserUtil.getUser(this.getSession());
    }

    /**
     * 获取用户角色授权菜单
     * @return
     */
    public List<Kv> getUserRoleMenu(String type) {
        return AuthUtil.getUserRoleMenu(getLoginUser().getId(),type);
    }

    /**
     * 验证用户操作权限
     * @param permission 权限标识
     * @return
     */
    public Boolean verifyAuth(String permission) {
        return AuthUtil.verifyAuth(getLoginUser().getId(), permission);
    }

    /**
     * 对json数据格式化<br> 
     * renderParseJson 与 renderJson 区别在于，
     * 如果数据为空时renderParseJson会直接删除不会再json中显示
     *
     * @author zhangby
     * @date 2018/10/17 下午2:18
     */
    public void renderParseJson(Object obj) {
        SerializeConfig config = new SerializeConfig();
        config.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase;
        renderText(JSON.toJSONString(obj, config, null, "yyyy-MM-dd HH:mm:ss", 1));
    }

    /**
     * 退出登录
     *
     * @author zhangby
     * @date 2018/9/12 下午3:11
     */
    public void logout4Session() {
        UserUtil.clearAll(getLoginUser().getId(),getSession());
    }

    /**
     * 对用户保存分装
     * 设置uuid,创建人，更新人（创建时间，更新时间由数据控制）
     * @author zhangby
     * @date 2018/9/19 下午3:42
     */
    public void save(Model model) {
        //获取当前登录用户
        User loginUser = getLoginUser();
        //获取id是否为空，不为空进行更新，否则进行新增
        if (ObjectUtil.isNotNull(model.get("id"))) {
            //更新，设置更新人
            model.set("update_user_id", loginUser.getId()).update();
        } else {
            //设置用户id 创建人 更新人
            if (model.get("id") instanceof String) {
                model.set("id", StrKit.getRandomUUID())
                        .set("create_user_id", loginUser.getId())
                        .set("update_user_id", loginUser.getId())
                        .save();
            } else {
                model.set("create_user_id", loginUser.getId())
                        .set("update_user_id", loginUser.getId())
                        .save();
            }
        }
    }

    /**
     * MD5加密
     * @return
     */
    public String md5(String str) {
        return SecureUtil.md5(str);
    }


    /**
     * 获取全部参数
     * @param isPage 是否获取分页信息
     * @return
     */
    public Dict getParamDict(boolean isPage) {
        Dict dict = Dict.create();
        getParaMap().forEach((k,v)->{
            dict.set(k, v[0]);
        });
        //验证分页，pageSize pageNum
        if (isPage) {
            Integer pageNum = 1;
            Integer pageSize = 10;
            //验证是否为数字
            if (NumberUtil.isNumber(getPara("pageNum"))) {
                pageNum = getParaToInt("pageNum");
            }
            //验证范围
            if (pageNum < 1 || pageNum > Integer.MAX_VALUE) {
                pageNum = 1;
            }
            //验证是否为数字
            if (NumberUtil.isNumber(getPara("pageSize"))) {
                pageSize = getParaToInt("pageSize");
            }
            //验证范围
            if (pageSize < 1 || pageSize > Integer.MAX_VALUE) {
                pageSize = 10;
            }
            dict.put("pageNum", pageNum);
            dict.put("pageSize", pageSize);
        }

        return dict;
    }

    /**
     * 获取参数
     *
     * @return
     */
    public Dict getParamDict() {
        return getParamDict(false);
    }
}
